import 'package:flutter/material.dart';
import 'dart:async'; // 用于 Future.delayed 模拟网络请求

// 应用入口函数
void main() {
  runApp(MyApp());
}

// 根组件
class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter 无限加载列表',
      theme: ThemeData(
        primarySwatch: Colors.indigo,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: InfiniteListScreen(),
    );
  }
}

// 无限加载列表屏幕
class InfiniteListScreen extends StatefulWidget {
  const InfiniteListScreen({Key? key}) : super(key: key);

  @override
  InfiniteListScreenState createState() => InfiniteListScreenState();
}

class InfiniteListScreenState extends State<InfiniteListScreen> {
  final List<String> _items = []; // 存储列表数据的列表
  final ScrollController _scrollController = ScrollController(); // 滚动控制器，用于监听滚动
  bool _isLoading = false; //标记是否正在加载更多数据
  bool _hasMore = true; // 标记是否还有更多数据可加载
  int _currentPage = 0; // 当前加载的“页码”

  // 特殊标记，用于表示列表末尾的加载指示器或“没有更多”提示
  static const String _loadingTag = "##loading##";
  static const String _noMoreTag = "##no_more##";

  @override
  void initState() {
    super.initState();
    _loadMoreData(); // 初始加载数据

    // 添加滚动监听
    _scrollController.addListener(() {
      // 当滚动到底部并且没有正在加载且还有更多数据时，加载更多
      if (_scrollController.position.pixels >=
              _scrollController.position.maxScrollExtent - 200 && // 提前200像素开始加载
          !_isLoading &&
          _hasMore) {
        _loadMoreData();
      }
    });
  }

  @override
  void dispose() {
    _scrollController.dispose(); // 清理控制器
    super.dispose();
  }

  // 模拟从数据源异步加载数据
  Future<void> _loadMoreData() async {
    if (_isLoading || !_hasMore) return; // 如果正在加载或没有更多数据，则不执行

    setState(() {
      _isLoading = true;
      // 如果之前有 "没有更多" 的标记，先移除它
      if (_items.isNotEmpty && _items.last == _noMoreTag) {
        _items.removeLast();
      }
      // 添加加载中标记（如果列表不为空且最后一个不是加载标记）
      if (_items.isEmpty || _items.last != _loadingTag) {
        _items.add(_loadingTag);
      }
    });

    // 模拟网络延迟
    await Future.delayed(Duration(seconds: 2));

    // 模拟获取新数据
    List<String> newItems = List.generate(15, (index) {
      int itemNumber = _currentPage * 15 + index + 1;
      return "列表项 $itemNumber";
    });

    _currentPage++;

    setState(() {
      // 移除加载中标记
      if (_items.isNotEmpty && _items.last == _loadingTag) {
        _items.removeLast();
      }
      _items.addAll(newItems);
      _isLoading = false;

      // 假设加载到一定数量后就没有更多数据了
      if (_currentPage >= 5) {
        // 模拟加载5页后没有更多
        _hasMore = false;
        _items.add(_noMoreTag); // 添加没有更多标记
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('无限加载列表 (ListView.builder)')),
      body: ListView.builder(
        controller: _scrollController, // 关联滚动控制器
        itemCount: _items.length, // 列表项总数
        itemBuilder: (BuildContext context, int index) {
          final item = _items[index];

          if (item == _loadingTag) {
            // 如果是加载标记，显示加载指示器
            return _buildLoadingIndicator();
          } else if (item == _noMoreTag) {
            // 如果是没有更多标记，显示提示信息
            return _buildNoMoreIndicator();
          } else {
            // 否则，显示正常的列表项
            return Card(
              margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
              elevation: 3,
              child: ListTile(
                leading: CircleAvatar(
                  child: Text((index + 1).toString()),
                  backgroundColor: Colors.indigo[100],
                  foregroundColor: Colors.indigo,
                ),
                title: Text(item),
                subtitle: Text('这是第 $index 个元素的描述信息'),
                trailing: Icon(
                  Icons.arrow_forward_ios,
                  size: 16,
                  color: Colors.grey,
                ),
                onTap: () {
                  // 可以添加点击事件
                  ScaffoldMessenger.of(
                    context,
                  ).showSnackBar(SnackBar(content: Text('点击了: $item')));
                },
              ),
            );
          }
        },
      ),
      // 可选：添加一个悬浮按钮手动触发加载 (用于测试)
      floatingActionButton:
          _isLoading || !_hasMore
              ? null
              : FloatingActionButton(
                onPressed: _loadMoreData,
                tooltip: '加载更多',
                child: Icon(Icons.add),
              ),
    );
  }

  // 构建加载中的指示器 Widget
  Widget _buildLoadingIndicator() {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            CircularProgressIndicator(strokeWidth: 2.0),
            SizedBox(height: 8),
            Text("正在加载中，请稍候...", style: TextStyle(color: Colors.grey[600])),
          ],
        ),
      ),
    );
  }

  // 构建 "没有更多了" 的指示器 Widget
  Widget _buildNoMoreIndicator() {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Center(
        child: Text(
          "--- 我是有底线的 ---",
          style: TextStyle(
            color: Colors.grey[500],
            fontStyle: FontStyle.italic,
          ),
        ),
      ),
    );
  }
}
